﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;

namespace Laps.Lib.WSDL.Parsers
{
    class WSDLParser
    {
        #region Champs
        private XmlReader _lecteur;
        private const string _wsdl = "http://schemas.xmlsoap.org/wsdl/";
        //private WSDLDefinitions _definitions;
        //private Dictionary<object, NodeViewModel> _noeuds;        
        #endregion

        #region Méthodes
        public WSDLParser()
        {
            _lecteur = null;
            //_definitions = null;
            //_noeuds = new Dictionary<object, NodeViewModel>();
        }
        private bool Move()
        {
            bool bfind = false, bsuivant = false;

            while (bfind == false && (bsuivant = _lecteur.Read()))
            {
                switch (_lecteur.NodeType)
                {
                    case XmlNodeType.Element:
                        {
                            bfind = true;
                            break;
                        }
                    case XmlNodeType.EndElement:
                        {
                            bfind = true;
                            break;
                        }
                }
            }
            return bsuivant;
        }
        public void Parse(string path)
        {
            //XmlReaderSettings settings;
            //NodeViewModel nvmNoeud;

            //settings = new XmlReaderSettings();
            //settings.DtdProcessing = DtdProcessing.Parse;
            //using (_lecteur = XmlReader.Create(new StreamReader(path), settings))
            //{
            //    if (this.Move() == true)
            //    {

            //        if (_lecteur.NodeType == XmlNodeType.Element && 
            //            _lecteur.LocalName.ToLower().Equals("definitions") == true)
            //        {
            //            _definitions = new WSDLDefinitions();
            //            if (_lecteur.HasAttributes == true)
            //            {
            //                _definitions.Name = _lecteur.GetAttribute("name");
            //                _definitions.Target = _lecteur.GetAttribute("target");
            //                nvmNoeud = new NodeViewModel();
            //                 _graphe.AddNode(nvmNoeud);
            //                 nvmNoeud.DisplayName = string.Format("{0} : Definitions", _definitions.Name);
            //                 _noeuds.Add(_definitions, nvmNoeud);
            //            }
            //            this.ParseDefinitions();                        
            //        }
            //    }
            //    _lecteur.Close();
            //}



        }

        public void ParseDefinitions()
        {
            //bool bterminer = false;
            //WSDLService wsService;
            //WSDLMessage wmMessage;
            //WSDLPortType wptPortType;
            //NodeViewModel nvmNouveau, nvmNoeud;
            //EdgeViewModel evmArc;            

            //while (bterminer == false && this.Move())
            //{            
            //    switch (_lecteur.NodeType)
            //    {
            //        case XmlNodeType.EndElement:
            //            {
            //                if (_lecteur.LocalName.Equals("definitions") == true)
            //                {
            //                    bterminer = true;
            //                }
            //                break;
            //            }
            //        case XmlNodeType.Element:
            //            {
            //                if (_lecteur.LocalName.Equals("import") == true)
            //                {

            //                }
            //                else if (_lecteur.LocalName.Equals("service") == true)
            //                {
            //                    wsService = new WSDLService();
            //                    if (_lecteur.HasAttributes == true)
            //                    {
            //                        wsService.Name = _lecteur.GetAttribute("name");
            //                        _definitions.AddService(wsService);
            //                        nvmNouveau = new NodeViewModel();
            //                        nvmNouveau.DisplayName = string.Format("{0} : Service", wsService.Name);
            //                        _graphe.AddNode(nvmNouveau);
            //                        _noeuds.Add(wsService, nvmNouveau);

            //                        if (_noeuds.TryGetValue(_definitions, out nvmNoeud) == true)
            //                        {
            //                            evmArc = new EdgeViewModel();
            //                            evmArc.Source = nvmNouveau;
            //                            evmArc.Target = nvmNoeud;
            //                            _graphe.AddEdge(evmArc);

            //                        }
            //                        this.ParseService(wsService);

            //                    }
            //                }
            //                else if (_lecteur.LocalName.Equals("portType") == true)
            //                {
            //                    wptPortType = new WSDLPortType();
            //                    if (_lecteur.HasAttributes == true)
            //                    {
            //                        wptPortType.Name = _lecteur.GetAttribute("name");
            //                        nvmNouveau = new NodeViewModel();
            //                        nvmNouveau.DisplayName = string.Format("{0} : PortType", wptPortType.Name);
            //                        _graphe.AddNode(nvmNouveau);
            //                        _noeuds.Add(wptPortType, nvmNouveau);
            //                        if (_noeuds.TryGetValue(_definitions, out nvmNoeud) == true)
            //                        {
            //                            evmArc = new EdgeViewModel();
            //                            evmArc.Source = nvmNouveau;
            //                            evmArc.Target = nvmNoeud;
            //                            _graphe.AddEdge(evmArc);
            //                        }
            //                    }
            //                    _definitions.AddPortType(wptPortType);
            //                    this.ParsePortType(wptPortType);
            //                }
            //                else if (_lecteur.LocalName.Equals("message") == true)
            //                {
            //                    wmMessage = new WSDLMessage();
            //                    if (_lecteur.HasAttributes == true)
            //                    {
            //                        wmMessage.Name = _lecteur.GetAttribute("name");
            //                        nvmNouveau = new NodeViewModel();
            //                        nvmNouveau.DisplayName = string.Format("{0} : Message", wmMessage.Name);
            //                        _graphe.AddNode(nvmNouveau);
            //                        _noeuds.Add(wmMessage, nvmNouveau);                                    
            //                        if (_noeuds.TryGetValue(_definitions, out nvmNoeud) == true)
            //                        {
            //                            evmArc = new EdgeViewModel();
            //                            evmArc.Source = nvmNouveau;
            //                            evmArc.Target = nvmNoeud;
            //                            _graphe.AddEdge(evmArc);
            //                        }
            //                    }
            //                    _definitions.AddMessage(wmMessage);
            //                    this.ParseMessage(wmMessage);
            //                }
            //                break;
            //            }
            //    }


            //}

        }
        //private void ParseMessage(WSDLMessage message)
        //{
        //    //bool bterminer = false;
        //    //WSDLPart wpPart;
        //    //NodeViewModel nvmNouveau, nvmNoeud;
        //    //EdgeViewModel evmArc;      

        //    //while (bterminer == false && this.Move())
        //    //{
        //    //    switch (_lecteur.NodeType)
        //    //    {
        //    //        case XmlNodeType.EndElement:
        //    //            {
        //    //                if (_lecteur.LocalName.Equals("message") == true)
        //    //                {
        //    //                    bterminer = true;
        //    //                }
        //    //                break;
        //    //            }
        //    //        case XmlNodeType.Element:
        //    //            {
        //    //                if (_lecteur.LocalName.Equals("part") == true)
        //    //                {
        //    //                    wpPart = new WSDLPart();
        //    //                    if (_lecteur.HasAttributes == true)
        //    //                    {
        //    //                        wpPart.Name = _lecteur.GetAttribute("name");
        //    //                        nvmNouveau = new NodeViewModel();
        //    //                        nvmNouveau.DisplayName = string.Format("{0} : Part", wpPart.Name);
        //    //                        _graphe.AddNode(nvmNouveau);
        //    //                        _noeuds.Add(wpPart, nvmNouveau);
        //    //                        if (_noeuds.TryGetValue(message, out nvmNoeud) == true)
        //    //                        {
        //    //                            evmArc = new EdgeViewModel();
        //    //                            evmArc.Source = nvmNouveau;
        //    //                            evmArc.Target = nvmNoeud;
        //    //                            _graphe.AddEdge(evmArc);
        //    //                        }
        //    //                    }
        //    //                    message.AddPart(wpPart);

        //    //                }
        //    //                break;
        //    //            }
        //    //    }
        //    //}
        //}
        //private void ParsePortType(WSDLPortType portType)
        //{
        //    //bool bterminer = false;
        //    //WSDLOperation woOperation = null;
        //    //WSDLMessage wmMessage;
        //    //NodeViewModel nvmNouveau = null, nvmParent;
        //    //EdgeViewModel evmArc;
        //    //string stemp;

        //    //while (bterminer == false && this.Move())
        //    //{
        //    //    switch (_lecteur.NodeType)
        //    //    {
        //    //        case XmlNodeType.EndElement:
        //    //            {
        //    //                if (_lecteur.LocalName.Equals("portType") == true)
        //    //                {
        //    //                    bterminer = true;
        //    //                }
        //    //                break;
        //    //            }
        //    //        case XmlNodeType.Element:
        //    //            {
        //    //                if (_lecteur.LocalName.Equals("operation") == true)
        //    //                {
        //    //                    woOperation = new WSDLOperation();
        //    //                    if (_lecteur.HasAttributes == true)
        //    //                    {
        //    //                        woOperation.Name = _lecteur.GetAttribute("name");                                  
        //    //                        portType.AddOperation(woOperation);

        //    //                    }
        //    //                    nvmNouveau = new NodeViewModel();
        //    //                    nvmNouveau.DisplayName = string.Format("{0} : Operation", woOperation.Name);
        //    //                    _graphe.AddNode(nvmNouveau);
        //    //                    _noeuds.Add(woOperation, nvmNouveau);
        //    //                    if (_noeuds.TryGetValue(portType, out nvmParent) == true)
        //    //                    {
        //    //                        evmArc = new EdgeViewModel();
        //    //                        evmArc.Source = nvmNouveau;
        //    //                        evmArc.Target = nvmParent;
        //    //                        _graphe.AddEdge(evmArc);
        //    //                    }
        //    //                }
        //    //                else if (_lecteur.LocalName.Equals("input") == true)
        //    //                {
        //    //                    if (_lecteur.HasAttributes == true)
        //    //                    {
        //    //                        XmlUrlResolver xur = new XmlUrlResolver();
        //    //                        stemp = _lecteur.GetAttribute("message");
        //    //                        stemp = stemp.Substring(stemp.IndexOf(':') + 1);

        //    //                        if (string.IsNullOrEmpty(stemp) == false &&
        //    //                            woOperation != null)
        //    //                        {
        //    //                            var message = (from mes in _definitions.Messages
        //    //                                           where mes.Name.Equals(stemp)
        //    //                                           select mes).FirstOrDefault();
        //    //                            woOperation.Input = message;
        //    //                            if (_noeuds.TryGetValue(message, out nvmParent) == true)
        //    //                            {
        //    //                                evmArc = new EdgeViewModel();
        //    //                                evmArc.Source = nvmNouveau;
        //    //                                evmArc.Target = nvmParent;
        //    //                                _graphe.AddEdge(evmArc);
        //    //                            }
        //    //                        }
        //    //                    }
        //    //                }
        //    //                else if (_lecteur.LocalName.Equals("output") == true)
        //    //                {
        //    //                    if (_lecteur.HasAttributes == true)
        //    //                    {
        //    //                        XmlUrlResolver xur = new XmlUrlResolver();
        //    //                        stemp = _lecteur.GetAttribute("message");
        //    //                        stemp = stemp.Substring(stemp.IndexOf(':') + 1);

        //    //                        if (string.IsNullOrEmpty(stemp) == false &&
        //    //                            woOperation != null)
        //    //                        {
        //    //                            var message = (from mes in _definitions.Messages
        //    //                                           where mes.Name.Equals(stemp)
        //    //                                           select mes).FirstOrDefault();
        //    //                            woOperation.Output = message;
        //    //                            if (_noeuds.TryGetValue(message, out nvmParent) == true)
        //    //                            {
        //    //                                evmArc = new EdgeViewModel();
        //    //                                evmArc.Source = nvmNouveau;
        //    //                                evmArc.Target = nvmParent;
        //    //                                _graphe.AddEdge(evmArc);
        //    //                            }
        //    //                        }
        //    //                    }
        //    //                }
        //    //                break;
        //    //            }

        //    //    }
        //    //}
        //}
        //private void ParseService(WSDLService service)
        //{
        //    //    bool bterminer = false;
        //    //    WSDLPort wpPort = null;
        //    //    WSDLBinding wbBinding = null;
        //    //    NodeViewModel nvmNouveau, nvmParent;
        //    //    EdgeViewModel evmArc;            

        //    //    while (bterminer == false && this.Move())
        //    //    {
        //    //        switch (_lecteur.NodeType)
        //    //        {
        //    //            case XmlNodeType.EndElement:
        //    //                {
        //    //                    if (_lecteur.LocalName.Equals("service") == true)
        //    //                    {
        //    //                        bterminer = true;
        //    //                    }
        //    //                    break;
        //    //                }
        //    //            case XmlNodeType.Element:
        //    //                {
        //    //                    if(_lecteur.LocalName.Equals("port") == true)
        //    //                    {
        //    //                        wpPort = new WSDLPort();
        //    //                        if (_lecteur.HasAttributes == true)
        //    //                        {
        //    //                            wpPort.Name =  _lecteur.GetAttribute("name");
        //    //                            service.AddPort(wpPort);
        //    //                            wbBinding = new WSDLBinding();
        //    //                            wbBinding.Name = _lecteur.GetAttribute("binding");
        //    //                            wpPort.SetBinding(wbBinding);
        //    //                        }
        //    //                        nvmNouveau = new NodeViewModel();
        //    //                        nvmNouveau.DisplayName = string.Format("{0} : Port", wpPort.Name);
        //    //                        _graphe.AddNode(nvmNouveau);
        //    //                        _noeuds.Add(wpPort, nvmNouveau);                                  
        //    //                        if (_noeuds.TryGetValue(service, out nvmParent) == true)
        //    //                        {
        //    //                            evmArc = new EdgeViewModel();
        //    //                            evmArc.Source = nvmNouveau;
        //    //                            evmArc.Target = nvmParent;
        //    //                            _graphe.AddEdge(evmArc);
        //    //                        }
        //    //                        if (wbBinding != null)
        //    //                        {
        //    //                            nvmParent = new NodeViewModel();
        //    //                            nvmParent.DisplayName = string.Format("{0} : Binding", wbBinding.Name);
        //    //                            _graphe.AddNode(nvmParent);
        //    //                            _noeuds.Add(wbBinding, nvmParent);
        //    //                            evmArc = new EdgeViewModel();
        //    //                            evmArc.Source = nvmNouveau;
        //    //                            evmArc.Target = nvmParent;
        //    //                            _graphe.AddEdge(evmArc);
        //    //                        }

        //    //                    }
        //    //                    break;
        //    //                }
        //    //        }
        //    //    }
        //}

        #endregion

        #region Propriétés
        #endregion
    }
}
